<?php

class Application_Model_UsuarioMapper
{
  protected $_dbTable;  

  private function setDbTable($dbTable)
  {
    if (is_string($dbTable)) {
      $dbTable = new $dbTable();
    }
    if (!$dbTable instanceof Zend_Db_Table_Abstract) {
      throw new Exception('Invalid table data gateway provided');
    }
    $this->_dbTable = $dbTable;
    
    return $this;
  }

  public function getDbTable()
  {
    if (null === $this->_dbTable) {
      $this->setDbTable('Application_Model_DbTable_Usuario');
    }
      return $this->_dbTable;
  }

  public function insert(Application_Model_Usuario $usuario)
    {
        $dados = array(
          'email'           => $usuario->getEmail(),
          'senha_salgada'   => $usuario->getSenhaSalgada(),
          'sal'             => $usuario->getSal(),
          'nome'            => $usuario->getNome(),
          'bolitos'         => $usuario->getBolitos(),
          'ativo'           => $usuario->getAtivo(),
          'administrador'   => $usuario->getAdministrador()
        );

        return $tabela = $this->getDbTable()->insert($dados);
        
    }
 
    public function save(Application_Model_Usuario $usuario)
    {
        $dados = array(
          'email'           => $usuario->getEmail(),
          'senha_salgada'   => $usuario->getSenhaSalgada(),
          'sal'             => $usuario->getSal(),
          'nome'            => $usuario->getNome(),
          'bolitos'         => $usuario->getBolitos(),
          'ativo'           => $usuario->getAtivo(),
          'administrador'   => $usuario->getAdministrador()
        );

        $tabela = $this->getDbTable();
        $select = $tabela->find($dados['email']);


        if (count($select) == 0) {
          return $this->getDbTable()->insert($dados);
        } else {
          return $this->getDbTable()->update($dados, array('email = ?' => $dados['email']));
        }
    }
 
    public function find($email, Application_Model_Usuario $usuario)
    {
        $result = $this->getDbTable()->find($email);
        if (0 == count($result)) {
            return;
        }
        $row = $result->current();
        $usuario->setEmail($row->email)
                  ->setSenhaSalgada($row->senha_salgada)
                  ->setSal($row->sal)
                  ->setNome($row->nome)
                  ->setBolitos($row->bolitos)
                  ->setAtivo($row->ativo)
                  ->setAdministrador($row->administrador);

        return $usuario;
    }

    public function getBolitos($email)
    {
        $result = $this->getDbTable()->find($email);
        if (0 == count($result)) {
            return;
        }
        $row = $result->current();

        return $row->bolitos;
    }

    public function findBySenhaSalgada($senhaSalgada, Application_Model_Usuario $usuario)
    {
      $tabela = $this->getDbTable();
      $select = $tabela->select();
      $select->from($tabela)->where('senha_salgada = ?', $senhaSalgada);

      $row = $tabela->fetchAll($select)->current();

      if (count($row) == 0)
        return NULL;

      $usuario->setEmail($row->email)
              ->setSenhaSalgada($row->senha_salgada)
              ->setSal($row->sal)
              ->setNome($row->nome)
              ->setBolitos($row->bolitos)
              ->setAtivo($row->ativo)
              ->setAtivo($row->administrador);
      
      return $usuario;
    }

    public function ranking($total, $inicio)
    {
        $tabela = $this->getDbTable();
        $select = $tabela->select();
        $select->from($tabela)
               ->where('ativo = true')
               ->order('bolitos DESC')
               ->limit($total, $inicio);

        return $tabela->fetchAll($select);
    }

    public function getTotalUsuarios()
    {
        $tabela = $this->getDbTable();
        $select = $tabela->select();
        $select->from($tabela)
               ->where('ativo = true');

        return $tabela->fetchAll($select);
    }

    public function fetchAll()
    {
        $resultSet = $this->getDbTable()->fetchAll();
        $entries   = array();
        foreach ($resultSet as $row) {
            $entry = new Application_Model_Usuario();
            $entry->setEmail($row->email)
                  ->setSenha($row->senha)
                  ->setNome($row->nome)
                  ->setBolitos($row->bolitos)
                  ->setAtivo($row->ativo)
                  ->setAdministrador($row->administrador);
            $entries[] = $entry;
        }
        return $entries;
    }

    public function inserirBolitos($email, $bolito)
    {
        $result = $this->getDbTable()->find($email);
        $row = $result->current();


        $dados = array(
                'bolitos'  => ($bolito + $row->bolitos),
        );

        return $this->getDbTable()->update($dados, array('email = ?' => $email));
    }

    public function recarregarBolitos($email, $bolito)
    {
        $dados = array(
                'bolitos'  => $bolito,
        );

        return $this->getDbTable()->update($dados, array('email = ?' => $email));
    }

    public function iniciaTrasacao()
    {
        $tabela = $this->getDbTable()->getAdapter()->beginTransaction();

    }

    public function finalizaTrasacao()
    {
        $tabela = $this->getDbTable()->getAdapter()->commit();
    }

    public function desfazer()
    {
        $tabela = $this->getDbTable()->getAdapter()->rollback();
    }

    /*
     * Receber uma lista de usuários e confere quais estão  presentes
     * no bd. Retorna então uma lista só com os usuários registrados.
     * Parâmetro $listaUsuarios: contém a lista de usuários a ser pesquisada
     */
    public function getListaUsuariosExistentes($listaUsuarios)
    {
        $listaUsuariosExistentes = array();
        foreach($listaUsuarios as $umUsuario){
            $tabela = $this->getDbTable();
            $select = $tabela->select();
            $select->from($tabela, '*')->where('usuario.email = ?', $umUsuario);
            $busca = $tabela->fetchRow($select);
            //se houver um registro, entao este usuario ja possui cadastro:
            if(isset($busca) && $busca->email)
                $listaUsuariosExistentes[] = $umUsuario;
        }//fim foreach
        return $listaUsuariosExistentes;
    }//fim funçao

    /*
     * Receber uma lista de usuários e confere quais não estão  presentes
     * no bd. Retorna então uma lista só com os usuários não registrados.
     * Parâmetro $listaUsuarios: contém a lista de usuários a ser pesquisada
     */
    public function getListaUsuariosInexistentes($listaUsuarios)
    {
        $listaUsuariosInexistentes = array();
        foreach($listaUsuarios as $umUsuario){
            $tabela = $this->getDbTable();
            $select = $tabela->select();
            $select->from($tabela, '*')->where('usuario.email = ?', $umUsuario);
            $busca = $tabela->fetchRow($select);
            //se houver um registro, entao este usuario ja possui cadastro:
            if(!isset($busca)) $listaUsuariosInexistentes[] = $umUsuario;
        }//fim foreach
        return $listaUsuariosInexistentes;
    }//fim funçao


    public function getNomePorEmail($email)
    {
        $tabela = $this->getDbTable();
        $select = $tabela->select();
        $select->from($tabela, '*')->where('usuario.email = ?', $email);
        $busca = $tabela->fetchRow($select);        
        return $busca->nome;
    }
}

